﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Biblioteca.dao.iClassesDAO.jogo;
using Biblioteca.classesBasicas.jogo;
using Biblioteca.util;
using System.Data.SqlClient;
using Biblioteca.classesBasicas.pessoa;

namespace Biblioteca.dao.classesDAO.jogo
{
    class PartidaDAO : Conexao, IPartidaDAO
    {
        public void cadastrar(Partida objeto)
        {
            try
            {
                this.abrirConexao();
                SqlCommand comandoSql = conexao.CreateCommand();
                comandoSql.CommandText = "INSERT INTO PARTIDA(TIPO, HORA, DURACAO, ID_RESERVA, ID_FUNCIONARIO) VALUES ('" + objeto.Tipo + "','" + objeto.Hora + "','" + objeto.Duracao + "'," + Convert.ToInt32(objeto.Reserva.Id) + "," + Convert.ToInt32(objeto.Funcionario.Id) + ")";
                comandoSql.ExecuteNonQuery();
                comandoSql.Dispose();
                this.fecharConexao();
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message + " Erro ao cadastar Partida.");
            }
            finally
            {
                this.fecharConexao();
            }

            
            foreach (Responsavel elemento in objeto.Jogadores)
            {
                try
                {
                    this.abrirConexao();
                    SqlCommand comando = new SqlCommand("EXEC PROCEDURE_CADASTRAR_JOGADOR " + Convert.ToInt32(elemento.Cliente.Id) + ", " + Convert.ToInt32(elemento.Equipamento.Arma.Id) + ", " + Convert.ToInt32(elemento.Equipamento.Capacete.Id) + ", " + Convert.ToInt32(elemento.Equipamento.Cilindro.Id) + ", " + Convert.ToInt32(elemento.Equipamento.Colete.Id), this.conexao);
                    comando.ExecuteNonQuery();
                    comando.Dispose();
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message + " Erro ao remover Partida.");
                }

                finally
                {
                    this.fecharConexao();
                }
            }
        }

        public void alterar(Partida objeto)
        {
            try
            {
                this.abrirConexao();
                SqlCommand comando = new SqlCommand("UPDATE PARTIDA SET TIPO='" + objeto.Tipo + "', HORA='" + objeto.Hora + "', DURACAO='" + objeto.Duracao + "'" + " WHERE PARTIDA.ID_PARTIDA=" + Convert.ToInt32(objeto.Id), this.conexao);
                comando.ExecuteNonQuery();
                comando.Dispose();
            }

            catch (Exception ex)
            {
                throw new Exception(ex.Message + " Erro ao alterar Partida.");
            }

            finally
            {
                this.fecharConexao();
            }
        }

        public void remover(Partida objeto)
        {
            try
            {
                this.abrirConexao();
                SqlCommand comando = new SqlCommand("EXEC PROCEDURE_DELETAR_PARTIDA " + Convert.ToInt32(objeto.Id), this.conexao);
                comando.ExecuteNonQuery();
                comando.Dispose();
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message + " Erro ao remover Partida.");
            }

            finally
            {
                this.fecharConexao();
            }
        }

        public Partida consultarPorId(string id)
        {
            Partida partidaMetodo = null;

            try
            {
                this.abrirConexao();
                SqlCommand comando = new SqlCommand("SELECT ID_PARTIDA, TIPO, HORA, DURACAO, ID_RESERVA, ID_FUNCIONARIO FROM PARTIDA", this.conexao);
                SqlDataReader DbReader = comando.ExecuteReader();
                while (DbReader.Read())
                {
                    partidaMetodo = new Partida();
                    partidaMetodo.Id = Convert.ToString(DbReader.GetInt32(DbReader.GetOrdinal("ID_PARTIDA")));
                    partidaMetodo.Tipo = DbReader.GetString(DbReader.GetOrdinal("TIPO"));
                    partidaMetodo.Hora = DbReader.GetString(DbReader.GetOrdinal("HORA"));
                    partidaMetodo.Duracao = DbReader.GetString(DbReader.GetOrdinal("DURACAO"));
                    partidaMetodo.Reserva = new Reserva();

                    if (DbReader.IsDBNull(DbReader.GetOrdinal("ID_RESERVA")))
                    {
                        partidaMetodo.Reserva.Id = "REMOVIDO";
                    }
                    else
                    {
                        partidaMetodo.Reserva.Id = Convert.ToString(DbReader.GetInt32(DbReader.GetOrdinal("ID_RESERVA")));
                    }

                    partidaMetodo.Funcionario = new Funcionario();

                    if (DbReader.IsDBNull(DbReader.GetOrdinal("ID_FUNCIONARIO")))
                    {
                        partidaMetodo.Funcionario.Id = "REMOVIDO";
                    }
                    else
                    {
                        partidaMetodo.Funcionario.Id = Convert.ToString(DbReader.GetInt32(DbReader.GetOrdinal("ID_FUNCIONARIO")));
                    }
                    
                }

                DbReader.Close();
                comando.Dispose();
            }

            catch (Exception ex)
            {
                throw new Exception(ex.Message + " Erro ao consultar a Partida.");
            }

            finally
            {
                this.fecharConexao();
            }
            return partidaMetodo;
        }

        public List<Partida> listar()
        {
            List<Partida> listaPartida = new List<Partida>();

            try
            {
                this.abrirConexao();
                SqlCommand comando = new SqlCommand("SELECT ID_PARTIDA, TIPO, HORA, DURACAO, ID_RESERVA, ID_FUNCIONARIO FROM PARTIDA", this.conexao);
                SqlDataReader DbReader = comando.ExecuteReader();
                while (DbReader.Read())
                {
                    Partida partidaMetodo = new Partida();
                    partidaMetodo.Id = Convert.ToString(DbReader.GetInt32(DbReader.GetOrdinal("ID_PARTIDA")));
                    partidaMetodo.Tipo = DbReader.GetString(DbReader.GetOrdinal("TIPO"));
                    partidaMetodo.Hora = DbReader.GetString(DbReader.GetOrdinal("HORA"));
                    partidaMetodo.Duracao = DbReader.GetString(DbReader.GetOrdinal("DURACAO"));
                    partidaMetodo.Reserva = new Reserva();

                    if (DbReader.IsDBNull(DbReader.GetOrdinal("ID_RESERVA")))
                    {
                        partidaMetodo.Reserva.Id = "REMOVIDO";
                    }
                    else
                    {
                        partidaMetodo.Reserva.Id = Convert.ToString(DbReader.GetInt32(DbReader.GetOrdinal("ID_RESERVA")));
                    }

                    partidaMetodo.Funcionario = new Funcionario();

                    if (DbReader.IsDBNull(DbReader.GetOrdinal("ID_FUNCIONARIO")))
                    {
                        partidaMetodo.Funcionario.Id = "REMOVIDO";
                    }
                    else
                    {
                        partidaMetodo.Funcionario.Id = Convert.ToString(DbReader.GetInt32(DbReader.GetOrdinal("ID_FUNCIONARIO")));
                    }

                    listaPartida.Add(partidaMetodo);
                }

                DbReader.Close();
                comando.Dispose();
            }

            catch (Exception ex)
            {
                throw new Exception(ex.Message + " Erro ao listar o Partida.");
            }

            finally
            {
                this.fecharConexao();
            }
            return listaPartida;
        }
        
    }
}
